/**
 **********************************************************************************************************************
 * @file    cot_os.h
 * @brief   该文件提供查询协作式多任务系统功能函数原型
 *
 * @details 该文件实现了一个轻量级的协程调度系统，主要特点：
 *          - 使用setjmp/longjmp实现任务切换
 *          - 支持独立栈和共享栈两种任务模式
 *          - 提供任务创建、调度、等待和同步等基本功能
 *          - 适用于资源受限的嵌入式系统
 *
 **********************************************************************************************************************
 */

/* Define to prevent recursive inclusion -----------------------------------------------------------------------------*/
#ifndef _COT_OS_H_
#define _COT_OS_H_

/* Includes ----------------------------------------------------------------------------------------------------------*/
#include <stdint.h>
#include <stddef.h>

/* 定义一个OS预编译宏 */
#define _COT_OS_

/* Exported types ----------------------------------------------------------------------------------------------------*/
typedef void (*cotOsTask_f)(int arg);        /* 任务函数类型定义 */
typedef uint32_t (*cotOsGetSysTime_f)(void); /* 系统时间获取函数类型定义 */
typedef int cotOsTask_t;                     /* 任务句柄类型定义 */

/* 条件变量结构体定义 */
typedef struct
{
  uint8_t flag; /* 条件标志，0表示未触发，1表示已触发 */
} CotOSCondition_t;

/* Exported constants ------------------------------------------------------------------------------------------------*/
/* 错误码定义 */
#define COT_ERROR_NOT_INIT -1           /* 系统未初始化 */
#define COT_ERROR_STACK_IS_NULL -2      /* 栈空间为空 */
#define COT_ERROR_STACK_OVERLAPPING -3  /* 栈空间重叠 */
#define COT_ERROR_TCB_MEM_FAIL -4       /* TCB内存分配失败 */
#define COT_ERROR_TCB_MEM_STACK_FAIL -5 /* 共享栈内存分配失败 */

/* Exported macro ----------------------------------------------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------------------------------------------------*/

/* 系统初始化与启动 */
extern void cotOs_Init(cotOsGetSysTime_f pfnOsTimer); /* 初始化协程操作系统 */
extern int cotOs_Start(void);                         /* 启动协程调度系统 */

/* 任务创建与管理 */
extern cotOsTask_t cotOs_CreatTaskWithStack(cotOsTask_f pfnOsTaskEnter, const char *pName, void *pStack, size_t stackSize, int arg); /* 创建使用独立栈的任务 */
extern cotOsTask_t cotOs_CreatTask(cotOsTask_f pfnOsTaskEnter, const char *pName, int arg);                                          /* 创建使用共享栈的任务 */
extern uint16_t cotOs_Pid(void);                                                                                                     /* 获取当前任务的ID */
extern void cotOs_Top(void);                                                                                                         /* 显示任务信息 */

/* 任务同步与调度 */
extern void cotOs_Wait(uint32_t time);    /* 当前任务等待指定时间(毫秒) */
extern void cotOs_Join(cotOsTask_t task); /* 等待指定任务结束 */

/* 条件变量操作 */
extern void cotOs_ConditionInit(CotOSCondition_t *pCondition);   /* 初始化条件变量 */
extern void cotOs_ConditionWait(CotOSCondition_t *pCondition);   /* 等待条件变量 */
extern void cotOs_ConditionNotify(CotOSCondition_t *pCondition); /* 通知条件变量 */

#endif // !_COT_OS_H_
